/**
 * phi
 */


var tm = {};


if (!Math.leap){
    Math.leap = function(v0, v1, amount) {
        return v0 + (v1-v0)*amount;
    };
}


(function(np){
    
    // ----------------------------------------------------------------
    /**
     * ベジエ曲線
     */
    var BezierCurve = {};
    
    
    // ----------------------------------------------------------------
    /**
     * t をもとに4 点から点を求める
     */
    BezierCurve.calc = function(t, p0, p1, p2, p3)
    {
        var tt  = t*t;
        var ttt = tt*t;
        
        var u   = (1-t);
        var uu  = u*u;
        var uuu = uu*u;
        
        return (uuu*p0) + (3*uu*t*p1) + (3*u*tt*p2) + (ttt*p3);
    };
    /*
    BezierCurve.calc = function(t, p0, p1, p2, p3)
    {
        var p4 = Math.leap(p0, p1, t);
        var p5 = Math.leap(p1, p2, t);
        var p6 = Math.leap(p2, p3, t);
        
        var p7 = Math.leap(p4, p5, t);
        var p8 = Math.leap(p5, p6, t);
        
        var p9 = Math.leap(p7, p8, t);
        
        return p9;
    };
    */
    
    
    // ----------------------------------------------------------------
    /**
     * 3次方程式を微分
     */
    BezierCurve.diffCubic = function(x, a, b, c)
    {
        return 3*a*x*x + 2*b*x + c;
    };
    
    
    // ----------------------------------------------------------------
    /**
     * 3次方程式を解く
     */
    BezierCurve.solveCubic = function(a, b, c, d, x)
    {
        // ニュートン法で近似値を求める
        var COUNT = 10;
        x = x || 0.5;
        for (var i=0; i<COUNT; ++i) {
            var fx = a*x*x*x + b*x*x + c*x + d;
            x = x - ( (fx) / (this.diffCubic(x, a, b, c)) );
        }
        return x;
    };
    
    
    // ----------------------------------------------------------------
    /**
     * x の値から t を求める
     */
    BezierCurve.toT = function(x, p0, p1, p2, p3)
    {
        // t についての３次方程式の形に置き換える
        return BezierCurve.solveCubic(
              p3 - 3*p2 + 3*p1 - p0,
            3*p2 - 6*p1 + 3*p0,
            3*p1 - 3*p0,
            p0-x,
            x
        );
    };
    
    np.BezierCurve = BezierCurve;

})(tm);

var BezierCurve = tm.BezierCurve;
























